#include<string.h>
#include "Grille.h"



char GetGrilleXY(const Grille * grille, const int x, const int y)
{
    assert (x>=0);
    assert (y>=0);
    assert (x< grille->dimX);
    assert (y< grille->dimY);
    return grille->tableau[y][x];
}


int GetDimX (const Grille * grille)
{
    return grille->dimX;
}


int GetDimY (const Grille * grille)
{
    return grille->dimY;
}


int GrilleInitialise (Grille * grille, int x, int y)
{
    int i, j;
    int valRetour = 1;
    grille->dimX= x;
    grille->dimY= y;
    if (( x > 0) && ( y > 0))
    {
        /* on cree la colonne qui va pointer sur toutes les lignes */
        grille->tableau = (char **)malloc(x*sizeof(char*));
        /* on cree chaque ligne */
        for  (i=0; i<y; i++)
        {
            grille->tableau[i] = (char*)malloc(y*sizeof(char));
        }

        if ( grille->tableau != NULL)
        {

            for (i=0; i < y; i++)
            {
                for (j=0; j < x; j++)
                {
                    grille->tableau[i][j] = '*';
                }

            }
        }
        else
        {
            valRetour=0;
        }
    }
    else
    {
        valRetour=0;
    }
    return valRetour;
}


void GrilleEfface (Grille * grille)
{
    int i;
    for  (i=0; i<grille->dimY; i++)
    {
        free(grille->tableau[i]);
    }
    free(grille->tableau);
    grille->tableau = NULL;
    grille->dimX = 0;
    grille->dimY = 0;
    grille->combin = 0;
}


void PionPoseDansGrille (Grille * grille, Pion * pion, int joueur)
{
	int y = GrilleLigneMin (grille, PionGetX(pion));
	 if (y > -1)
	{
		if( joueur == 1)
		{
			grille->tableau[y][PionGetX(pion)] = 'X';
			joueur = JoueurSuivant(joueur);
		}
		else
		{
			grille->tableau[y][PionGetX(pion)] = 'O';
			joueur = JoueurSuivant(joueur);
		}
	}
}


void SetGrille (Grille * grille, const int x, const int y, const char valeur)
{
    grille->tableau[y][x] = valeur;
}


void GrilleAffiche (const Grille * grille)
{
    int i, j;
    for (i=0; i<(grille->dimY); i++)
    {
        for (j=0; j<(grille->dimX); j++)
        {
            printf("%c", ((grille->tableau)[i][j]));
        }
        printf("\n");
    }
}


int GrilleRemplie (const Grille * grille)
{
    int remplie;
    int i, j;
    for (i=0; i<grille->dimY; i++)
    {
        for (j=0; j<grille->dimX; j++)
        {
            if (grille->tableau[i][j] != '*')
            {
                remplie = 1;
            }
            else
            {
                return 0;
            }
        }
    }
    return 1;
}


int GrilleLigneMin (const Grille * grille, int NumColonne)
{
    int i;
    for ( i=0 ; i < grille->dimY ; i++ )
    {
        if ( GetGrilleXY( grille, NumColonne, i) == 'O' || GetGrilleXY ( grille, NumColonne, i) == 'X' )
        {
            return i-1;
        }
    }
    return grille->dimY -1;
}


int JoueurSuivant (int joueur)
{
    if (joueur == 1)
    {

        return 2;
    }
    return 1;
}
